<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js webgl - materials - shaders [lava]</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
		<style>
			body {
				color: #ffffff;
				font-family:Monospace;
				font-size:13px;
				text-align:center;
				font-weight: bold;
				background-color: #000000;
				margin: 0px;
				overflow: hidden;
			}
			#info {
				position: absolute;
				top: 0px; width: 100%;
				padding: 5px;
			}
			a { color: #ffffff; }
			#webglmessage a { color:#da0 }
		</style>
	</head>
	<body>
		<div id="container"></div>
		<script src="../src/three.js"></script>

        <!-- <script src="js/shaders/ConvolutionShader.js"></script> -->
        <script src="../src/libs/ConvolutionShader.js"></script>
        <!-- <script src="js/shaders/CopyShader.js"></script> -->
        <script src="../src/libs/CopyShader.js"></script>
		<!-- <script src="js/shaders/FilmShader.js"></script> -->
        <script src="../src/libs/FilmShader.js"></script>
        <!-- <script src="js/postprocessing/EffectComposer.js"></script> -->
        <script src="../src/libs/EffectComposer.js"></script>
        <!-- <script src="js/postprocessing/ShaderPass.js"></script> -->
        <script src="../src/libs/ShaderPass.js"></script>
		<script src="../src/libs/MaskPass.js"></script>
		<!-- <script src="js/postprocessing/RenderPass.js"></script> -->
        <script src="../src/libs/RenderPass.js"></script>
        <!-- <script src="js/postprocessing/BloomPass.js"></script> -->
        <script src="../src/libs/BloomPass.js"></script>
        <!-- <script src="js/postprocessing/FilmPass.js"></script> -->
        <script src="../src/libs/FilmPass.js"></script>
		<!-- <script src="js/WebGL.js"></script> -->
		<script src="../src/libs/WebGL.js"></script>
		<script src="../src/OrbitControls.js"></script>
		<script id="fragmentShader" type="x-shader/x-fragment">
			uniform float time;
			uniform float fogDensity;
			uniform vec3 fogColor;
			uniform sampler2D texture1;
			uniform sampler2D texture2;
			varying vec2 vUv;
			void main( void ) {
				vec2 position = - 1.0 + 2.0 * vUv;
				vec4 noise = texture2D( texture1, vUv );
				vec2 T1 = vUv + vec2( 1.5, - 1.5 ) * time * 0.02;
				vec2 T2 = vUv + vec2( - 0.5, 2.0 ) * time * 0.01;
				T1.x += noise.x * 2.0;
				T1.y += noise.y * 2.0;
				T2.x -= noise.y * 0.2;
				T2.y += noise.z * 0.2;
				float p = texture2D( texture1, T1 * 2.0 ).a;
				vec4 color = texture2D( texture2, T2 * 2.0 );
				vec4 temp = color * ( vec4( p, p, p, p ) * 2.0 ) + ( color * color - 0.1 );
				if( temp.r > 1.0 ) { temp.bg += clamp( temp.r - 2.0, 0.0, 100.0 ); }
				if( temp.g > 1.0 ) { temp.rb += temp.g - 1.0; }
				if( temp.b > 1.0 ) { temp.rg += temp.b - 1.0; }
				gl_FragColor = temp;
				float depth = gl_FragCoord.z / gl_FragCoord.w;
				const float LOG2 = 1.442695;
				float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );
				fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );
				gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );
				//gl_FragColor = color;
			}
		</script>

		<script id="vertexShader" type="x-shader/x-vertex">
			uniform vec2 uvScale;
			varying vec2 vUv;
			void main()
			{
				vUv = uvScale * uv;	// UV 贴图的坐标值
				vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
				gl_Position = projectionMatrix * mvPosition;
			}
		</script>

		<script>
			if ( WEBGL.isWebGLAvailable() === false ) {
				document.body.appendChild( WEBGL.getWebGLErrorMessage() );
			}
			var container;
			var camera, scene, renderer, composer, clock;
			var uniforms, mesh;

			init();
			animate();

			function init() {
				container = document.getElementById( 'container' );
				camera = new THREE.PerspectiveCamera( 35, window.innerWidth / window.innerHeight, 1, 3000 );
				camera.position.z = 4;
				scene = new THREE.Scene();
				clock = new THREE.Clock();
				var textureLoader = new THREE.TextureLoader();

				uniforms = {
					"fogDensity": { value: 0.45 },
					"fogColor": { value: new THREE.Vector3( 0, 0, 0 ) },
					"time": { value: 1.0 },
					"uvScale": { value: new THREE.Vector2( 3.0, 1.0 ) },
					"texture1": { value: textureLoader.load( 'cloud.png' ) },
					"texture2": { value: textureLoader.load( 'lavatile.jpg' ) }
				};
				uniforms[ "texture1" ].value.wrapS = uniforms[ "texture1" ].value.wrapT = THREE.RepeatWrapping;
				uniforms[ "texture2" ].value.wrapS = uniforms[ "texture2" ].value.wrapT = THREE.RepeatWrapping;
				var size = 0.65;
				var material = new THREE.ShaderMaterial( {
					uniforms: uniforms,
					vertexShader: document.getElementById( 'vertexShader' ).textContent,
					fragmentShader: document.getElementById( 'fragmentShader' ).textContent
				} );
				mesh = new THREE.Mesh( new THREE.TorusBufferGeometry( size, 0.3, 30, 30 ), material );
				mesh.rotation.x = 0.3;
				scene.add( mesh );
				//
				renderer = new THREE.WebGLRenderer( { antialias: true } );
				renderer.setPixelRatio( window.devicePixelRatio );
				container.appendChild( renderer.domElement );
				renderer.autoClear = false;		// 关闭自动清除颜色缓冲
				//
				var renderPass = new THREE.RenderPass( scene, camera );			// renderpass
				var effectBloom = new THREE.BloomPass( 1.25 );					// 泛光
				var effectFilm = new THREE.FilmPass( 0.35, 0.95, 2048, false );	// 添加电影银幕效果
				composer = new THREE.EffectComposer( renderer );
				composer.addPass( renderPass );
				composer.addPass( effectBloom );
				composer.addPass( effectFilm );
				//
				onWindowResize();
				window.addEventListener( 'resize', onWindowResize, false );

				var controller = new THREE.OrbitControls(camera,render.domElement)
			}
			function onWindowResize() {
				renderer.setSize( window.innerWidth, window.innerHeight );
				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();
				composer.reset();
			}
			//
			function animate() {
				requestAnimationFrame( animate );
				render();
			}
			function render() {
				var delta = 5 * clock.getDelta();
				uniforms[ "time" ].value += 0.2 * delta;
				// mesh.rotation.y += 0.0125 * delta;
				// mesh.rotation.x += 0.05 * delta;
				renderer.clear();
				composer.render( 0.01 );
			}
		</script>

	</body>
</html>